home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / getchar.arc / GETCHAR.PAS
Encoding:
Pascal/Delphi Source File  |  1985-06-20  |  5.1 KB  |  162 lines

  1.    The following is a list of keyboard values and the key or key sequences
  2. that give those values.  This list and all routines have been written on the
  3. IBM PC with TURBO V2.0.
  4.  
  5. KEY NUMBER    KEY(S)
  6. ----------    ------
  7.    127        Ctrl Backspace
  8.    131        Ctrl 2 or @ (NUL character)
  9. 132 - 135     Alt (9, 0, -, =)
  10.    136        Ctrl PgUp
  11.    143        Shift Tab
  12. 144 - 153     Alt (Q, W, E, R, T, Y, U, I, O, P)
  13. 158 - 166     Alt (A, S, D, F, G, H, J, K, L)
  14. 172 - 178     Alt (Z, X, C, V, B, N, M)
  15. 187 - 196     F1 - F10
  16.    199        Home
  17.    200        Up Arrow
  18.    201        PgUp
  19.    203        Left Arrow
  20.    205        Right Arrow
  21.    207        End
  22.    208        Down Arrow
  23.    209        PgDn
  24.    210        Ins
  25.    211        Del
  26. 212 - 221     Shift F1 - F10
  27. 222 - 231     Ctrl F1 - F10
  28. 232 - 241     Alt F1 - F10
  29.    242        Ctrl PrtSc
  30.    243        Ctrl Left Arrow
  31.    244        Ctrl Right Arrow
  32.    245        Ctrl End
  33.    246        Ctrl PgDn
  34.    247        Ctrl Home
  35. 248 - 255     Alt 1 - 8
  36.  
  37.    It seems that there are two distinct needs for getting character routines.
  38. The first is to obtain a specific character or one of a specific set of
  39. characters.  This case is handled by the function GETCHAR.  The second is to
  40. determine whether or not a key has been pressed and if it has, what value does
  41. it have.  This case is handled by the function KEYPRESS.
  42.  
  43. FUNCTION GETCHAR (ALLOWABLE : CHARSET) : CHAR;
  44.  
  45. { TYPE NEEDED : CHARSET = SET OF CHAR
  46.   INCLUDE FILE NEEDED : BEEP.MOD
  47.   RETURNS KEY VALUE ENTERED FROM THE KEYBOARD.
  48.   WILL DISPLAY CHARACTERS IN THE RANGE FROM 32 TO 126 ASCII.
  49.   HANDLES ALL SPECIAL KEYS LISTED ABOVE.
  50.   ALLOWABLE IS THE SET OF ALLOWABLE CHARACTERS.
  51.   RETURNS A CONTROL-C AS A #3. }
  52.  
  53.    TYPE
  54.       REGPACK = RECORD
  55.                 AX, BX, CX, DX, BP, SI, DI, DS, ES, FLAGS : INTEGER;
  56.                 END;  (* OF RECORD *)
  57.  
  58.    VAR
  59.       REGS  : REGPACK; (* VARIABLE TO ACCESS DOS *)
  60.       HIGH  : BYTE;    (* VALUE OF HIGH BYTE OF AX *)
  61.       LOW   : BYTE;    (* VALUE OF LOW BYTE OF AX *)
  62.       ENTRY : CHAR;    (* CHARACTER ENTERED AT KEYBOARD *)
  63.       GOOD  : BOOLEAN; (* TRUE IF ENTRY IS IN THE ALLOWABLE SET *)
  64.  
  65.    BEGIN (* FUNCTION GETCHAR *)
  66.  
  67.    REPEAT
  68.       REGS.AX := 0;
  69.       INTR ($16, REGS);
  70.       HIGH := HI (REGS.AX);
  71.       LOW := LO (REGS.AX);
  72.       IF LOW = 0
  73.          THEN BEGIN { EXTENDED CODE }
  74.               IF HIGH > 127 { HAPPENS WITH ALT 9, 0, -, = AND CTRL PGUP }
  75.                  THEN HIGH := HIGH - 124;
  76.               LOW := 128 + HIGH;
  77.               END;  { EXTENDED CODE }
  78.       ENTRY := CHR (LOW);
  79.       GOOD := ENTRY IN ALLOWABLE;
  80.       IF NOT GOOD
  81.          THEN BEEP
  82.          ELSE IF ENTRY IN [#32..#126] { PRINTABLE CHARACTERS }
  83.                  THEN WRITE (ENTRY);
  84.    UNTIL GOOD;
  85.    GETCHAR := ENTRY;
  86.  
  87.    END;  (* FUNCTION GETCHAR *)
  88.  
  89. FUNCTION KEYPRESS (VAR ASCII : BYTE) : BOOLEAN;
  90.  
  91. { ASCII WILL BE THE VALUE OF THE LOW BYTE AT 600.
  92.   THIS LOCATION RETURNS THE CHARACTER PRESSED OR ZERO IF NO CHARACTER
  93.        WAS PRESSED.
  94.   YOU MUST INITIALIZE THE DX REGISTER TO $FF WHEN CALLING 600.  }
  95.  
  96.    TYPE
  97.       REGPACK = RECORD
  98.                 AX, BX, CX, DX, BP, SI, DI, DS, ES, FLAGS : INTEGER;
  99.                 END;  (* OF RECORD *)
  100.  
  101.    VAR
  102.       REGS : REGPACK; (* VARIABLE TO ACCESS DOS *)
  103.  
  104.    BEGIN (* FUNCTION KEYPRESS *)
  105.  
  106.    REGS.AX := $600;
  107.    REGS.DX := $FF;
  108.    MSDOS (REGS);
  109.    ASCII := LO (REGS.AX);
  110.    IF ASCII = 0
  111.       THEN BEGIN (* EITHER NO KEY OR EXTENDED CODE *)
  112.            REGS.AX := $600;
  113.            REGS.DX := $FF;
  114.            MSDOS (REGS);
  115.            ASCII := LO (REGS.AX);
  116.            IF ASCII = 0
  117.               THEN KEYPRESS := FALSE (* NO KEY HAS BEEN PRESSED *)
  118.               ELSE BEGIN (* A SPECIAL KEY WAS PRESSED *)
  119.                    IF ASCII > 127 (* SAME ROUTINE AS IN GETCHAR *)
  120.                       THEN ASCII := ASCII - 124;
  121.                    ASCII := ASCII + 128;
  122.                    KEYPRESS := TRUE;
  123.                    END;  (* A SPECIAL KEY WAS PRESSED *)
  124.            END   (* EITHER NO KEY OR EXTENDED CODE *)
  125.       ELSE KEYPRESS := TRUE; (* A "NORMAL" KEY HAS BEEN PRESSED *)
  126.  
  127.    END;  (* FUNCTION KEYPRESS *)
  128.  
  129.    Note that GETCHAR requires the following procedure BEEP.
  130.  
  131. PROCEDURE BEEP;
  132.  
  133. { THIS PROCEDURE WILL PRODUCE A BEEP AT 600 HERTZ FOR .1 SECONDS.
  134.   SOUNDS BETTER AND IS FASTER THAN A WRITE (CHR (7)).
  135.   CALL THIS PROCEDURE ONCE AFTER BOOTING SINCE THE SYSTEM DOES NOT
  136.        SEEM TO ACTIVATE THE SPEAKER ON THE FIRST CALL. }
  137.  
  138.    BEGIN (* PROCEDURE BEEP *)
  139.  
  140.    SOUND (600);
  141.    DELAY (100);
  142.    NOSOUND;
  143.  
  144.    END;  (* PROCEDURE BEEP *)
  145.  
  146.    I do not know why this does not work on the first call after a fresh
  147. boot - any speaker experts out there?
  148.  
  149.    If these are of interest, I have modules that build on function GETCHAR.
  150. These are GETSTRING, GETFILENAME, GETINTEGER, and GETREAL.  They make
  151. interactive input a breeze.
  152.  
  153. Jeff Cole
  154. Anoka - Ramsey Community College
  155. 11200 Mississippi Boulevard N.W.
  156. Coon Rapids, MN 55433
  157. (612) 427 - 2600 ext. 246
  158.  
  159. You can find Jeff on Terrapin Station BBS -- 612/623-0152
  160. 24 hours -- 300/1200/2400
  161.  
  162.